S pomočjo naključnih števil bomo določili število π
Približek za število π lahko določimo tako, da izberemo n
naključnih točk
v kvadratu [0,1]×[0,1], ter preštejemo, koliko jih leži v krogu s središčem
v (0,0) in polmerom 1. Če je n
dovolj velik, mora biti razmerje med številom
točk v krogu in številom vseh točk približno π/4, saj z veliko točkami
"pokrijemo" kvadrat oz. del kroga, ki imata ploščini 1 oziroma π/4.
Sestavi funkcijo približekPi(stTočk)
, ki izračuna približek za število π po
opisani metodi. Število naključnih točk funkcija dobi kot parameter.
Seveda math.pi
nima v vaši funkciji kaj početi!
import random def približekPi(stTočk): '''S simulacijo izbire stTočk določi približek za Pi''' kolikoVKrogu = 0 stPoskusa = 1 while stPoskusa <= stTočk: # naredimo toliko "poskusov" # naključna točka v kvadratu x = random.random() y = random.random() razdalja = x*x + y*y if razdalja <= 1 : kolikoVKrogu += 1 stPoskusa = stPoskusa + 1 # izračunamo razmerje razm = kolikoVKrogu / stTočk return razm * 4
Sestavi funkcijo dvakratZapored()
, ki vrne kolikokrat smo
vrgli kocko, da smo dvakrat zapored vrgli 6. če npr. mečemo
2, 6, 3, 4, 6, 4, 5, 6, 6, ...
smo torej kocko morali vreči 9x, da smo dvakrat zapored vrgli 6.
import random def dvakratZapored(): '''Kolikometov je potrebnih, da dvakrat zapored vržemo 6''' številoMetov = 0 prejšniMet = 42 # koliko smo vrgli v prejšnem metu (karkoli razen 6!) while True : # kar neskončna zanka, izstopili bomo z return met = random.randint(1,6) številoMetov += 1 if (met == 6) and (prejšniMet == 6): return številoMetov prejšniMet = met
Sestavi funkcijo verjetnostDveh6(n)
, ki na podlagi n
klicev prejšnje
funkcije dvakratZapored()
ugotovi,
kolikokrat smo v povprečju v n
poskusih morali vreči kocko, da smo
dvakrat zapored vrgli 6.
import random def verjetnostDveh6(stPoskusov): skupnoŠtMetov = 0 poskus = 1 while poskus <= stPoskusov: številoMetov = dvakratZapored() # opravimo eno poskus skupnoŠtMetov = skupnoŠtMetov + številoMetov poskus = poskus + 1 # verjetnost return skupnoŠtMetov / stPoskusov
Ogledali si bomo koliko naključnih števil mora računalnik generirati, da dobi tako s samimi enakimi decimalkami
Spodnja funkcija vrne vsoto prvih petih decimalk števila x.
Pri tem je predpostavka, da pri računanju abs(x - int(x))
ne pride do
zaokrožitvenih napak!!!!!
Predelaj jo v funkcijo z imenom enakeDecimalke(x, k)
tako,
da bo preverila, ali ima realno število x prvih k decimalk enakih.
def vsota(x):
'''Vsota prvih 5 decimalk števila x'''
vs = 0
x = abs(x - int(x))
i = 1
while i <= 5:
x = x * 10
decim = int(x)
vs = vs + decim
x = x - decim
i = i + 1
return vs
Opomba: Načeloma se zadeve ne da narediti čisto prav. Če npr. uradno rešitev preizkusimo na
enakeDecimalke(2.2222,4)
dobimo napačen rezultat! Oglej si zakaj, tako da izračunaš x - int(x)
tega števila.
K nalogi se bomo vrnili kasneje in si pomagali z nizi!
def enakeDecimalke(x, k): ''' ali ima število x prvih k decimalk enakih ''' s = 0 x = abs(x - int(x)) # decimalni del prvaDecimalka = int(x*10) i = 1 while i <= k: x = x * 10 trenutnaDecimalka = int(x) if prvaDecimalka != trenutnaDecimalka : return False # napačna decimalka! x = x - int(x) # še preostale decimalke i = i + 1 return True # vsi testi so bili uspešni
Uporabi funkcijo enakeDecimalke
v novi funkciji z imenom
kolikoGenerirati(k)
, ki bo preštela, koliko naključnih
realnih števil med 0 in 1 moramo generirati, da bomo dobili decimalno število, ki
ima prvih k
decimalk enakih. Funkcija naj vrne tudi to število - vrne torej par
(koliko, nakŠtevilo)
!
import random def kolikoGenerirati(k): koliko = 0 # števec generiranih nak. števil jeUstrezno = False while not jeUstrezno : #Dokler ne bomo naleteli na ustrezno število nakŠtevilo = random.random() koliko += 1 if enakeDecimalke(nakŠtevilo, k) : # je število ustrezno? jeUstrezno = True #skočimo iz zanke return (koliko, nakŠtevilo)